home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / auto_cad / flexdu.lsp < prev    next >
Text File  |  1989-10-14  |  4KB  |  117 lines

  1. ; program to draw flex ducts as zig-zag line 08-10-89 REV 4 Jim Weisbin
  2. ; draw arc (supply 3 points) or straight (2 points and return)
  3. ; diameter=width of zig-zag saved as system variable userr4
  4. ; pline width saved as system variable userr5
  5. ; rib spacing is 3 inches on center
  6. ; flex ducts are usually between 1 and 6 ft long - outside of
  7. ; these limits you may get very strange looking results!
  8. ;
  9. (DEFUN C:FLEXDUCT (/ d1 d3 w ribsp p1 p2 p3 p4 p5 count s1 s2 a1 a2 a90
  10.        a270 a360 a3 a4 mid1 mid2 sang eang temp a1 a2 x w radius c1)
  11.  (setvar "cmdecho" 0)
  12.  (graphscr)
  13.  (setq d1 (getvar "userr4")
  14.        d1 (if (or (not (numberp d1)) (zerop d1)) 6.0 d1)
  15.        w (if (numberp (setq w (getvar "userr5"))) w 0.0)
  16.        ribsp 3.0
  17.  )
  18.  ; (initget 1)
  19.  (if
  20.  (setq p1 (getpoint "\nStart point: "))
  21.  (progn
  22.  (initget 1)
  23.  (setq p2 (getpoint p1 "\nPoint on arc: "))
  24.  (while (equal p1 p2)
  25.    (initget 1)
  26.    (setq p2 (getpoint p1 "\nSame point not allowed - Point on arc: "))
  27.  ) ; end while
  28.  (grdraw p1 p2 -1)
  29.  (setq p3 (getpoint p2 "\nEnd point/<straight line>: "))
  30.  (if (null p3) (setq p3 p2))
  31.  (grdraw p2 p3 -1)
  32.  (initget 6)
  33.  (setq d3 (getdist p3 (strcat "\nHalf diameter/<" (rtos d1 2 2) ">: "))
  34.       d1 (if (null d3) d1 d3)      
  35.       mid1 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))
  36.       mid2 (list (/ (+ (car p2) (car p3)) 2) (/ (+ (cadr p2) (cadr p3)) 2))
  37.       a1 (angle p1 p2)
  38.       a2 (angle p2 p3)
  39.       ; check if angle 1 is 180 degrees from angle 2
  40.       ; if yes, then this is a straight duct:
  41.       p3 (if (= (angle p1 p2) ( angle p3 p2)) p2 p3)
  42.       x (getdist (strcat "\nPline width <" (rtos w 2 2) ">  "))
  43.       w (if (null x) w x)
  44.       a90 (/ pi 2.0)
  45.       a270 (* pi 1.5)
  46.       a360 (* pi 2.0)
  47.  )
  48.  (prompt "Diameter = ")
  49.  (princ (* d1 2.0))
  50.  ; update user variables:
  51.  (setvar "userr4" d1)
  52.  (setvar "userr5" w)
  53.  ;
  54.  ; start the pline:
  55.  ;
  56.  (command "pline" p1 "w" w w)
  57.  ; if a1=a2 or p2=p3 then this is a straight line, else draw curved
  58.  (if (or (equal a1 a2) (equal p2 p3)) 
  59.    (progn 
  60.      (if (< (distance p1 p3) (distance p1 p2))
  61.          (setq p3 p2)
  62.      ) ; end if
  63.            ; ensure that count is rounded up to an even number:
  64.      (setq count (* 2 (fix (+ (/ (distance p1 p3) ribsp 2) 0.5)))
  65.            ; divide distance by count to get each segment:
  66.            seg (/ (distance p1 p3) count)
  67.            ; get starting point:
  68.            temp (polar p1 (- a1 pi) (/ seg 2.0))
  69.      )
  70.      (repeat (/ count 2)
  71.         (command (polar (setq temp (polar temp a1 seg))
  72.                  (+ a1 a90) d1))
  73.         (command (polar (setq temp (polar temp a1 seg))
  74.                  (- a1 a90) d1))
  75.      ) end repeat      
  76.    ) ; end progn (if)
  77.    (progn
  78.      (setq p4 (polar mid1 (- a1 a90) d1))
  79.      (setq p5 (polar mid2 (- a2 a90) d1))
  80.      (setq c1 (inters mid1 p4 mid2 p5 nil)
  81.            radius (distance c1 p1)
  82.            sang (angle c1 p1)
  83.            eang (angle c1 p3)
  84.            a3 (abs (- (angle p2 p1) (angle p2 p3)))
  85.            a3 (if (>= a3 pi) (- a360 a3) a3)
  86.            a4 (- (angle p1 p2) (angle p2 p3))
  87.            a1 (abs (- sang eang))
  88.            a2 (if (> a1 pi) (- a360 a1) a1)
  89.            a2 (if (< a3 a90) (- a360 a2) a2)
  90.            count (* 2 (fix (+ (/ (* radius a2) ribsp 2) 0.5)))
  91.            s1 (/ a2 count)
  92.            s2 (if (> sang eang) (- 0.0 s1) s1)
  93.            s2 (if (< a3 a90) (- 0.0 s2) s2)
  94.            s2 (if (> a1 pi) (- 0.0 s2) s2)
  95.            s2 (if (or (= a4 a90) (= a4 (- 0.0 a270))) (- 0.0 s1) s2)
  96.            s2 (if (or (= a4 a270) (= a4 (- 0.0 a90))) s1 s2)
  97.            temp (- sang (/ s2 2.0))
  98.       )
  99.       (repeat (/ count 2)
  100.          (command (polar c1 (setq temp (+ temp s2)) (+ radius d1)))
  101.          (command (polar c1 (setq temp (+ temp s2)) (- radius d1)))
  102.        ) ; end repeat
  103.      ) ; end progn (else)
  104.    ) ; end if
  105.    ; now finish the polyline:
  106.    (command p3 "")
  107.    ; clean up the drawing:
  108.    (grdraw p1 p2 -1)
  109.    (grdraw p2 p3 -1)
  110.    (redraw (entlast) 1)
  111.  ) ; end main progn
  112.  ) ; end main if
  113. (princ)
  114. ) ; end function
  115. ; run the function after first load:
  116. (C:FLEXDUCT)